package src.itheima02;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

import java.util.Set;

/*
    Map集合遍历第二种方式: 键值对方式             ---------------必须掌握----------------

    Map<K,V>接口内部定义了静态接口Entry<K,V>,用来描述结婚证/键值对的
    所以只要是Map集合的实现类,该实现类内部必然会定义一个类,实现Entry接口,
    覆盖重写抽象方法,描述自己的结婚证(键值对/映射关系)

    Map.Entry<K,V> 接口:
        抽象方法:
            public abstract K getKey() : 获取键
            public abstract V getValue() : 获取值

    Map接口的所有实现类,都描述了自己的结婚证(键值对),问题是如何获取所有的键值对呢?如果每个集合定义自己的方法,导致方法不统一,程序员使用不方便
        解决方案:
        Map<K,V> 接口内部,定义抽象方法
        Set<Entry> entrySet(): 获取所有的键值对对象的
        所有Map的实现类,必然覆盖重写该方法,获取键值对对象

    Map<K,V>接口:
        抽象方法:
             public abstract Set<Map.Entry<K,V>> entrySet() : 获取Map集合中的所有的键值对组成的Set集合

    使用步骤:
        1.创建Map集合对象,键: String,值: String
        2.Map集合对象调用put方法,存储多个键值对
        3.Map集合对象调用entrySet方法,获取所有的键值对对应的Set集合
        4.遍历所有的键值对(Entry对象)对应的Set集合: 迭代器/增强for
        5.获取当前键值对(Entry对象)对象
        6.键值对(Entry对象)对象调用getKey方法,获取键
        7.键值对(Entry对象)对象调用getValue方法,获取值
        8.打印键和值

 */
public class Demo05MapEach {
    public static void main(String[] args) {
        //1.创建Map集合对象,键: String,值: String
        Map<String,String> map = new LinkedHashMap<>();

        //2.Map集合对象调用put方法,存储多个键值对
        map.put("邓超","孙俪");
        map.put("李晨","范冰冰");
        map.put("刘德华","柳岩");

        //3.Map集合对象调用entrySet方法,获取所有的键值对对应的Set集合
        Set<Map.Entry<String, String>> set = map.entrySet();

        //4.遍历所有的键值对(Entry对象)对应的Set集合: 迭代器
        Iterator<Map.Entry<String, String>> it = set.iterator();

        while(it.hasNext()) {
            //5.获取当前键值对(Entry对象)对象
            Map.Entry<String, String> entry = it.next();

            //6.键值对(Entry对象)对象调用getKey方法,获取键
            String key = entry.getKey();

            //7.键值对(Entry对象)对象调用getValue方法,获取值
            String value = entry.getValue();

            //8.打印键和值
            System.out.println(key+"::::"+value);

        }
        System.out.println("-----------------------------");
        //4.遍历所有的键值对(Entry对象)对应的Set集合: 增强for
        for(Map.Entry<String,String> entry : set) {
            //5.获取当前键值对(Entry对象)对象: entry
            //6.键值对(Entry对象)对象调用getKey方法,获取键
            String key = entry.getKey();
            //7.键值对(Entry对象)对象调用getValue方法,获取值
            String value = entry.getValue();
            //8.打印键和值
            System.out.println(key+"======="+value);
        }
        System.out.println("-----------------------------");
        //最简单的增强for
        for(Map.Entry<String,String> entry : map.entrySet()){
            System.out.println(entry.getKey()+"~~~~~"+entry.getValue());
        }
    }
}
